package com.main.controller;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.generico.dao.ctg.CtgCatalogoDao;
import com.generico.dto.ctg.CtgCatalogo;
import com.generico.exception.AsiWebException;
import com.main.cliente.dto.Pedido;
import com.main.cliente.dto.SgiPersona;
import com.main.dao.AsistenciaTecnicaDAO;
import com.main.dao.ClienteDAO;
import com.main.dao.ClienteHistorialCompraDAO;
import com.main.dao.InventarioDao;
import com.main.dao.OrdenTrabajoDAO;
import com.main.dao.PedidoDAO;
import com.main.dao.PedidoDetalleDAO;
import com.main.dao.SgiPersonaDao;
import com.main.dao.UserDAO;
import com.main.java.AsistenciaTecnica;
import com.main.java.Cliente;
import com.main.java.DetalleRequisicion;
import com.main.java.Empleado;
import com.main.java.Inventario;
import com.main.java.OrdenTrabajo;
import com.main.java.Producto;
import com.main.java.Requisicion;
import com.main.java.User;
import com.main.service.AsistenciaTecnicaService;
import com.web.security.CustomUser;
import com.web.util.GenericoUtil;

@Controller
@RequestMapping("/empleado")
public class OrdenTrabajoController extends BaseController{
	
	@Autowired
	private ClienteHistorialCompraDAO clienteHistorialCompraDAO;

	
	
	@Autowired
	private CtgCatalogoDao ctgCatalogoDao;
	
	@Autowired
	private PedidoDAO pedidoDAO;
	
	@Autowired
	private PedidoDetalleDAO pedidoDetalleDAO;
	
	@Autowired
	private UserDAO userDAO;
	
	@Autowired
	private OrdenTrabajoDAO ordenTrabajoDAO;
	
	@Autowired
	private InventarioDao inventarioDao;
	
	@RequestMapping(value = "/ordenTrabajo")
	public String ordenTrabajo(ModelMap model) {
		
		/**
		 * verificando si en inventario hay niveles bajos de materia prima
		 */
		boolean nivelBajo = false;
		
		
		
		
		model.put("pedidos", JSONArray.fromObject(clienteHistorialCompraDAO.obtenerTodosLosPedidos()));
		model.put("ctgColor", JSONArray.fromObject(ctgCatalogoDao.findAllActivesAsArray(GenericoUtil.CTG_COLORES)));
		model.put("materiaPrima", JSONArray.fromObject(inventarioDao.obtenerInventario()));
		model.put("usuarioId", GenericoUtil.getSgdUsuarioIdFromAcegi());
		model.put("userName", GenericoUtil.getUserName());
		model.put("rol", GenericoUtil.getRol().toString());
		return "empleado/ordenTrabajo";
		
	}
	
	@RequestMapping(value = "/guardarOrdenTrabajo", method = RequestMethod.POST)
	public void guardarRequisicion(HttpServletResponse response,
			@RequestParam(value = "materiales") String materiales,
			@RequestParam(value = "usuario") Long usuario){
		Map<String, Object> result = new HashMap<String, Object>();
	//
		boolean existencia = true;
		String materialAgotado = StringUtils.EMPTY, cantidadAgotada = StringUtils.EMPTY;
		
		try{
			if(materiales.isEmpty()){
				result.put(FAILURE, true);
				result.put(MESSAGE, "Debe elegir Materia Prima para poder continuar");
			}else{
				Inventario inventario = new Inventario();
				BigDecimal invDisponible, cantSolicitada, cantMinInv, diferencia, bg1, bg2;
				int comp1, comp2;
				/*
				 * Verificndo existencia en inventario
				 * cantidadSolicitada viene en materialExistenteArray[0]
				 * materiaPrimaId viene en ctgCatalogoDao.findByCtgCatalogoId(Long.parseLong(materialExistenteArray[3]))
				 */
				String[] materialesExistenciaArray = materiales.split("&");
				for (int i = 0; i < materialesExistenciaArray.length; i++) {
					String materialExisteArray = materialesExistenciaArray[i];
					String[] materialExistenteArray = materialExisteArray.split("~");
					
					inventario = inventarioDao.obtenerInventarioPorId(Long.parseLong(materialExistenteArray[3]));
					
					invDisponible = new BigDecimal(inventario.getInventarioCantidad());
					cantSolicitada = new BigDecimal(materialExistenteArray[0].toString());
					cantMinInv = new BigDecimal(inventario.getCtgMateriaPrimaId().getCtgCatalogoDescripcion());
					diferencia = invDisponible.subtract(cantMinInv);
					materialAgotado = inventario.getCtgMateriaPrimaId().getCtgCatalogoNombre();
					cantidadAgotada = diferencia.subtract(new BigDecimal(1)).toString();
					
					comp1 = invDisponible.compareTo(cantMinInv);
					comp2 = cantSolicitada.compareTo(diferencia);
					
					if (comp1 == 1) {
						if (comp2 == 1) {
							existencia = false;
							throw new AsiWebException("<font color=\"red\"><b>" + materialAgotado +
									" Agotado En Inventario UD. solicita " + cantSolicitada + " U "
									+ "Inventario cuenta con " + diferencia + " U "
									+ " Porfavor Hacer Requisicion Para Su Aprobacion</b></font>");
						}
					} 
					
//					else {
//						throw new AsiWebException("<font color=\"red\"><b>" + materialAgotado +
//								" Agotado En Inventario Porfavor Hacer Requisicion Para Su Aprobacion</b></font>");
//					}
					
					// usamos los 2 objetos creados previamente BigDecimal
//					bg1 = new BigDecimal(materialExistenteArray[0].toString());
//					bg2 = new BigDecimal(inventario.getInventarioCantidad());
					// create int object
//					int res;
//					res = bg1.compareTo(bg2); // comparar bg1 with bg2
//					String str1 = "Ambos valores son iguales";
//					String str2 = "Lo que pide es mayo al inventario";
//					String str3 = "Suficiente en inventario";
//					if (res == 0) {
//						// System.out.println( str1 );
//						existencia = false;
//						throw new AsiWebException("<font color=\"red\"><b>Material Agotado En Inventario Porfavor Hacer Requisicion A Gerente Para Su Aprobacion</b></font>");
//					} else if (res == 1) {
//						// System.out.println( str2 );
//						existencia = false;
//						throw new AsiWebException("<font color=\"red\"><b>Material Agotado En Inventario Porfavor Hacer Requisicion A Gerente Para Su Aprobacion</b></font>");
//					} else if (res == -1) {
//						// System.out.println( str3 );
//						existencia = true;
//					}
				}
				
				
				if (existencia) {
					String[] materialesArray = materiales.split("&");
						for (int i = 0; i < materialesArray.length; i++) {
							String materialArray = materialesArray[i];
							String[] materialIndArray = materialArray.split("~");
								OrdenTrabajo ordenTrabajo = new OrdenTrabajo();
								
								/**
								 *Restando la materiaprima consumida a la tabla inventario
								 */
								inventario = inventarioDao.obtenerInventarioPorId(Long.parseLong(materialIndArray[3]));
								bg1 = new BigDecimal(materialIndArray[0].toString());
								bg2 = new BigDecimal(inventario.getInventarioCantidad());
								
								inventario.setInventarioCantidad(String.valueOf(bg2.subtract(bg1)));
								inventarioDao.guardarOActualizarInventario(inventario);
								
								ordenTrabajo.setCtgCatalogoColor(ctgCatalogoDao.findByCtgCatalogoId(Long.parseLong(materialIndArray[1])));
								ordenTrabajo.setCtgCatalogoMateriales(ctgCatalogoDao.findByCtgCatalogoId(Long.parseLong(materialIndArray[8])));
								ordenTrabajo.setOrdenTrabajoCantidad(materialIndArray[0]);
								ordenTrabajo.setOrdenTrabajoFechaIngreso(GenericoUtil.dateFormatAsDD_MM_YYYY___HH_MM_SS_A.format(new Date()));
								ordenTrabajo.setOrdenTrabajoYarda(materialIndArray[5]);
								Pedido pedido = new Pedido();
								pedido = pedidoDAO.encontrarPedidoPorId(Long.parseLong(materialIndArray[7]));
								pedido.setPedidoEstado("2");
								ordenTrabajo.setPedido(pedido);
								ordenTrabajo.setPedidoDetalle(pedidoDetalleDAO.encontrarPedidoDetallePorId(Long.parseLong(materialIndArray[6])));
								ordenTrabajo.setUser(userDAO.getUserById(usuario));
								ordenTrabajoDAO.guardarOrdenTrabajo(ordenTrabajo);
						}
	
					result.put(MESSAGE, "Orden de Trabajo Guardada");
					result.put(SUCCESS, true);
					List<Object[]> list = clienteHistorialCompraDAO.obtenerTodosLosPedidos();
					result.put("pedidos", JSONArray.fromObject(list));
			} else {
				result.put(FAILURE, true);
				result.put(MESSAGE, "<font color=\"red\"><b>" + materialAgotado +
									" Agotado En Inventario Porfavor Hacer Requisicion Para Su Aprobacion</b></font>");
			}
				
				
			
			}

		} catch (AsiWebException e) {
			result.put(FAILURE, true);
			result.put(MESSAGE, GenericoUtil.getExceptionMessage(e));
			logger.error(e, e);
		} catch (Exception e) {
			result.put(FAILURE, true);
			result.put(MESSAGE, GenericoUtil.ERROR_MESSAGE);
			logger.error(e, e);
		}
		serializeObject(result, response);
	}
	
}
	
	

	
	

